package visual

import (
	"cgs-server/server/model"
	"encoding/base64"
	"fmt"
	"go.mongodb.org/mongo-driver/bson/primitive"
)

// 视图
type Visual struct {
	ID            primitive.ObjectID `json:"id" bson:"ID"`                       // 主键
	IdObjID       primitive.ObjectID `json:"-" bson:"-"`                         // 弃用
	Title         string             `json:"title" bson:"Title"`                 // 大屏标题
	BackgroundUrl string             `json:"backgroundUrl" bson:"BackgroundUrl"` // 大屏背景
	Category      *int32             `json:"category" bson:"Category"`           // 大屏类型，这里不知道blade为什么不用分类ID
	OrgCategory   *int32             `json:"orgCategory" bson:"orgCategory"`     // 组织类型
	Password      string             `json:"password" bson:"password"`           // 发布密码
	//CreateTime    time.Time // 创建时间
	//UpdateTime    time.Time // 修改时间
	Status       *int32             `json:"status" bson:"Status"`       // 状态
	Username     string             `json:"username" bson:"Username"`   // 所属用户
	ProjectID    string             `json:"projectID" bson:"ProjectID"` //Project ID
	ProjectObjID primitive.ObjectID `json:"-" bson:"-"`
	SceneID      string             `json:"sceneID" bson:"-"`

	Theme string `json:"theme" bson:"theme"`
	Icon  string `json:"icon" bson:"icon"` // 应用图标

	// Key 存储 visualId, projectId, sceneId 加密后的字符串
	Key string `json:"key,omitempty" bson:"-"`

	model.TenantModel `json:",inline" bson:",inline"`
}

func (v *Visual) SetId(id primitive.ObjectID) {
	v.ID = id
}

func (v *Visual) GetId() string {
	return v.ID.Hex()
}

func (v *Visual) SetKey() {
	//v.Key = helper.Encrypt(fmt.Sprintf("%s_%s", v.ProjectID, v.SceneID))
	v.Key = base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s_%s", v.ProjectID, v.SceneID)))
}

// Config 配置
type Config struct {
	ID        primitive.ObjectID `json:"id" bson:"ID"` // 主键
	IdObjID   primitive.ObjectID `json:"-" bson:"-"`
	VisualId  primitive.ObjectID `json:"visualId" bson:"VisualId"`   // 可视化表主键
	Detail    string             `json:"detail" bson:"Detail"`       // 配置 json
	Component string             `json:"component" bson:"Component"` // 组件 json
	SceneUrl  string             `json:"sceneUrl" bson:"SceneUrl"`   // 场景地址

	RequestData string `json:"requestData" bson:"requestData"` // 工作流

	// AutoTrigger 是否在表单更新时自动触发工作流
	AutoTrigger *bool `json:"autoTrigger" bson:"autoTrigger"`

	model.TenantModel `json:",inline" bson:",inline"`
}

func (c *Config) SetId(id primitive.ObjectID) {
	c.ID = id
}
func (c *Config) GetId() string {
	return c.ID.Hex()
}

type Model struct {
	Visual     Visual `json:"visual"`
	Config     Config `json:"config"`
	VisualType string `json:"visualType"`

	IsPortal bool `json:"isPortal,omitempty" bson:"isPortal,omitempty"` // 是否是从portal创建
}

// 选择器用
type VisualCascade struct {
	Value    string           `json:"value"`
	Label    string           `json:"label"`
	Children []*VisualCascade `json:"children,omitempty"`
}

type CgsFile struct {
	Id         primitive.ObjectID `json:"id" bson:"ID"`
	FileName   string             `json:"fileName" bson:"FileName"`
	FileSize   int64              `json:"fileSize" bson:"FileSize"`
	FileType   string             `json:"fileType" bson:"FileType"`
	Name       string             `json:"name" bson:"Name"`
	OriginName string             `json:"originName" bson:"OriginName"`
	SavePath   string             `json:"savePath" bson:"SavePath"`
	Thumbnail  string             `json:"thumbnail" bson:"Thumbnail"`
	Url        string             `json:"url" bson:"Url"`

	model.TenantModel `json:",inline" bson:",inline"`
}

func (c *CgsFile) SetId(id primitive.ObjectID) {
	c.Id = id
}

func (c *CgsFile) GetId() string {
	return c.Id.Hex()
}

type PutFileResult struct {
	Link         string `json:"link" bson:"-"`
	Domain       string `json:"domain" bson:"-"`
	Name         string `json:"name" bson:"-"`
	OriginalName string `json:"originalName" bson:"-"`
}
